# -*- coding:utf-8 -*-
# author:qiong   time:2021/9/17
import json
import time

from selenium.webdriver.support import expected_conditions as EC

from appium import webdriver            # 如果app模拟和浏览器同时用，为防止撞名，可以把其中一个起别名使用，例如 from appium import webdriver as app_driver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait



class UntilsDriver:
    _driver = None
    # 获取驱动对象
    @classmethod
    def get_app_driver(cls):
        # 初始化app配置信息
        if cls._driver == None:
            des_cap = {
                "platformName": "android",      # 表示的是android 或ios
                "platfromVersion": "7.1.2",     # 表示的是平台系统的版本号
                "deviceName": "****",   # 表示的是设备的ID名称（如果只有一个设备可以用****来代替
                "appPackage": "com.xmtj.mkz",      # 表示app的包名
                "appActivity": ".MainActivity",      # 表示的是app的界面名
                "noReset": True,         # 用来记住app的session，如果有登录或做过初始化的操作，为Ture时，后面不需要再登录
                "resetKeyboard": True,  # 重置设备的输入键盘
                "unicodeKeyboard": True,  # 采用unicode编码输入
                "automationName": "Uiautomator2"        # 获取toast消息定位
            }
            cls._driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub",des_cap)      # 启动模拟器，配置默认即可
        return cls._driver

    # 退出驱动对象
    @classmethod
    def quit_app_driver(cls):
        if cls._driver is not None:
            cls.get_app_driver().quit()
            cls._driver = None


def get_toast(toast):
    # time.sleep(1)
    try:
        toast_path =By.XPATH, "//*[contains(@text,'%s')]" % toast
        text = WebDriverWait(UntilsDriver.get_app_driver(),10,0.5).until(EC.presence_of_element_located(toast_path)).text
        return text
    except:
        return False

def get_appdata(flie):
    with open(flie,encoding='utf-8') as f:
        case_data = json.load(f)
        parameter_value = []
        for case in case_data.values():
            parameter_value.append(tuple(case.values()))

    return parameter_value


# 判断元素是否存在
def element_is_exist(driver,text):
    """
        :param driver:  浏览器驱动对象
        :param text:   定位元素的文本内容
        :return:
        """
    xpath = "//*[contains(text(), '{}')]".format(text)
    #   //*[contains(text(), '新增文章成功']
    try:
        time.sleep(2)
        return driver.find_element(By.XPATH, xpath)
    except Exception as e:
        return False


# 封装边滑动边查找的方法
def swipe_find(driver,element,target_ele):
    """
    :param driver: 表示的是app的驱动
    :param element: 表示的滑动的元素对象
    :param target_ele: 表示的是要查找的元素的定位的值
    :return:
    """


    # 此坐标无法滑动,
    # ele_size = element.size # 获取元素大小
    # width = ele_size["width"]   # 获取元素的宽度
    # height = ele_size["height"] # 获取元素的高度
    #
    # # 获得element元素左上角点的坐标
    # ele_position = element.location
    # x = ele_position["x"]   # 获取左上角点的X坐标值
    # y = ele_position["y"]   # 获取左上角点的Y坐标值
    # start_y = y + height*0.8     # 获取的是起始点y的值
    # x = x +width*0.5           # 获取的是起始及终止点的x的值,  从下往上滑，X值不会变
    # end_y = y + height*0.2       # 获取的是终止点y的值
    # zb = (start_y,x,end_y,x)

    # 使用手机屏幕宽高 代替原先固定起始数值
    # 向上滑
    w = driver.get_window_size()['width']
    h = driver.get_window_size()['height']
    # zb = (540,1728,540,192)
    zb = (w/2,h*0.8,w/2,h*0.2)


    while True:
        page = driver.page_source       # 记录查找前的页面资源，通过对比页面资源来退出死循环
        try:
            driver.find_element(*target_ele).click()  #如果有找到对应的元素那么点击并返回

            return True
        except Exception as e:
            print("没有找到该元素")
        # driver.swipe(start_y,x,end_y,x,duration=1000)   # 没有找到元素，那么滑屏后再对比并重新查找
        driver.swipe(*zb,duration=1000)   # 没有找到元素，那么滑屏后再对比并重新查找
        time.sleep(1)
        if page == driver.page_source:
            print('滑屏操作完成且没有找到元素信息')
            return False



